package cn.aiweiyi.qingjing.coupon.comm.vo;

import cn.aiweiyi.qingjing.coupon.comm.constant.PeriodType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

/**
 * @author 青衿
 * @Date 2020/11/16 19:54
 * 优惠券.规则用于对规则进行封装,便于转为JSON格式存入数据库
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TemplateRule {
    //过期规则
    private Expiration expiration;

    //优惠额度
    private Discount discount;

    //使用范围
    private Usage usage;

    //领取数据限制
    private Integer limit;

    //权重,可以和哪些优惠券叠加,同类不叠加,list[优惠券编码]
    private String weight;

    //验证方法,验证自身的各种规则是否有效
    public boolean validate() {
        return expiration.validate() && discount.validate()
                && limit > 0 && usage.validate()
                && StringUtils.isNotEmpty(weight);
    }

    //有效期限骨子额
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Expiration {
        //有效期规则,对应PeriodType枚举的code值
        private Integer period;

        //有效间隔,只对PeriodType.SHIFT有效
        private Integer gap;

        //模板失效日期,两类都有效
        private Long deadline;

        boolean validate() {
            return null != PeriodType.of(period)
                    && gap > 0 && deadline > 0;
        }
    }

    //折扣规则
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Discount {
        //优惠额度:满减(20),立减(30),折扣(85)
        private Integer quota;

        //只对满减有效,达到多少金额就按quota计算优惠额度
        private Integer base;

        boolean validate() {
            return quota > 0 && base > 0;
        }
    }

    //使用范围限制
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Usage {
        //限使用省份
        private String province;

        //限城市使用
        private String city;

        //限使用的商品类型,list[娱乐.图书,美妆]
        private String goodsType;

        boolean validate() {
            return StringUtils.isNotBlank(province)
                    && StringUtils.isNotBlank(city)
                    && StringUtils.isNotBlank(goodsType);
        }
    }
}
